package cn.chinaflame.pagodas.service;

import cn.chinaflame.pagodas.Result.Result;
import cn.chinaflame.pagodas.constant.Sysconst;
import cn.chinaflame.pagodas.dto.PaProductAreaDto;
import cn.chinaflame.pagodas.entity.PaProductArea;
import cn.chinaflame.pagodas.enums.CodeEnum;
import cn.chinaflame.pagodas.repository.PaProductAreaRepository;
import cn.chinaflame.pagodas.utils.DateTimes;
import cn.chinaflame.pagodas.utils.ParamPreconditions;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.stereotype.Service;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.util.List;
import java.util.stream.Collectors;
import static cn.chinaflame.pagodas.constant.Sysconst.AREAS;
import static cn.chinaflame.pagodas.constant.Sysconst.POSITIONS;
/**
 * 商品区域service
 *
 * @author created by boming
 * @date 2018年1月6日 下午2:35:17
 */
@Service
public class PaProductAreaService {


    private static final Logger log = LoggerFactory.getLogger(PaProductAreaService.class);

    @Autowired
    private PaProductAreaRepository ywProductAreaRepository;
    @Autowired
    private IdGeneratorService idGeneratorService;
    /**
     * 查询商品区域列表
     *
     * @param pageIndex
     * @param pageSize
     * @param id
     * @param name
     * @return
     */
    public Result<List<PaProductAreaDto>> queryList(Integer pageIndex, Integer pageSize, String id, String name) {
        log.info("查询商品区域列表id:{},name:{}", id, name);
        if (!Strings.isNullOrEmpty(id)) {
            PaProductArea area = ywProductAreaRepository.findOne(id);
            if (area != null && Sysconst.ENABLED_FALSE.equals(area.getState()))
                return Result.create(Lists.newArrayList());
            PaProductAreaDto dto = new PaProductAreaDto();
            BeanUtils.copyProperties(area, dto);
            return Result.create(Lists.newArrayList(dto));
        } else if (!Strings.isNullOrEmpty(name)) {
            List<PaProductArea> areas = ywProductAreaRepository.findByName(name);
            List<PaProductAreaDto> dtos = Lists.newArrayList();
            for (PaProductArea area : areas) {
                PaProductAreaDto dto = new PaProductAreaDto();
                BeanUtils.copyProperties(area, dto);
                dtos.add(dto);
            }
            return Result.create(dtos);
        } else {
            List<PaProductArea> areas = ywProductAreaRepository.findAll();
            List<PaProductAreaDto> dtos = Lists.newArrayList();
            for (PaProductArea area : areas) {
                if (Sysconst.ENABLED_FALSE.equals(area.getState()))
                    continue;
                PaProductAreaDto dto = new PaProductAreaDto();
                BeanUtils.copyProperties(area, dto);
                dtos.add(dto);
            }
            return Result.create(dtos);
        }
    }

    /**
     * 查询商品区域列表
     *
     * @param pageIndex
     * @param pageSize
     * @param id
     * @param name
     * @return
     */
    public Result<List<PaProductAreaDto>> queryListByPage(Integer pageIndex, Integer pageSize, String id, String name) {
        log.info("查询商品区域列表id:{},name:{}", id, name);
        Pageable p = new PageRequest(pageIndex - 1, pageSize, new Sort(Direction.DESC, "updatetime"));
        if (!Strings.isNullOrEmpty(id)) {
            PaProductArea area = ywProductAreaRepository.findOne(id);
            if (area != null && Sysconst.ENABLED_FALSE.equals(area.getState()))
                return Result.create(Lists.newArrayList());
            PaProductAreaDto dto = new PaProductAreaDto();
            BeanUtils.copyProperties(area, dto);
            return Result.createPage(Lists.newArrayList(dto));
        } else if (!Strings.isNullOrEmpty(name)) {
            Page<PaProductArea> entityPage = ywProductAreaRepository.findByName(name, p);
            List<PaProductArea> areas = entityPage.getContent();
            List<PaProductAreaDto> dtos = Lists.newArrayList();
            for (PaProductArea area : areas) {
                PaProductAreaDto dto = new PaProductAreaDto();
                BeanUtils.copyProperties(area, dto);
                dtos.add(dto);
            }
            return Result.createPage(dtos);
        } else {
            Page<PaProductArea> entityPage = ywProductAreaRepository.findAll(p);
            List<PaProductArea> areas = entityPage.getContent();
            List<PaProductAreaDto> dtos = Lists.newArrayList();
            for (PaProductArea area : areas) {
                if (Sysconst.ENABLED_FALSE.equals(area.getState()))
                    continue;
                PaProductAreaDto dto = new PaProductAreaDto();
                BeanUtils.copyProperties(area, dto);
                dtos.add(dto);
            }
            return Result.createPage(dtos);
        }
    }

    /**
     * 添加商品区域
     *
     * @param name
     * @return
     */
    public PaProductAreaDto add(String name) {
        log.info("添加商品区域name:{}", name);
        String id = idGeneratorService.generateProductAreaId();
        PaProductArea area = new PaProductArea();
        area.setId(id);
        area.setName(name);
        String areaNo = name.replace("区", "");
        areaNo = Integer.parseInt(areaNo)<10?"0"+areaNo+"01":areaNo+"01";
        area.setAreaNo(areaNo);
        area.setItemId("");
        area.setState(Sysconst.ENABLED_TRUE);
        area.setCreatetime(DateTimes.nowDateTime());
        area.setUpdatetime(DateTimes.nowDateTime());
        area = ywProductAreaRepository.saveAndFlush(area);
        PaProductAreaDto dto = new PaProductAreaDto();
        BeanUtils.copyProperties(area, dto);
        return dto;
    }

    /**
     * 更新商品区域
     *
     * @param id
     * @param name
     * @return
     */
    public PaProductAreaDto update(String id, String name) {
        log.info("更新商品区域id:{},name:{}", id, name);
        PaProductArea area = ywProductAreaRepository.findOne(id);
        ParamPreconditions.checkArgument(area != null, CodeEnum.FAIL.getCode(), "未找到记录");
        area.setName(name);
        area.setUpdatetime(DateTimes.nowDateTime());
        area = ywProductAreaRepository.saveAndFlush(area);
        PaProductAreaDto dto = new PaProductAreaDto();
        BeanUtils.copyProperties(area, dto);
        return dto;
    }

    /**
     * 删除商品区域
     *
     * @param id
     * @return
     */
    public Boolean delete(String id) {
        log.info("删除商品区域id:{}", id);
        ParamPreconditions.checkNotEmpty(id, CodeEnum.FAIL.getCode(), "id不能为空");
        PaProductArea area = ywProductAreaRepository.findOne(id);
        if (area == null) return true;
        area.setState(Sysconst.ENABLED_FALSE);
        ywProductAreaRepository.saveAndFlush(area);
        return true;
    }
    
	 /**
	  * 加载所有区号
	  * @return
	  */
	public void loadProductAreas() {
//		String sql = "select updatetime,name,substring(area_no,1,2) area_no,item_id,state from pa_product_area where state = 0";
//		List<PaProductArea> list = jdbcTemplate.query(sql,(RowMapper<PaProductArea>) (rs, rowNum) -> {
//			PaProductArea result = new PaProductArea();
//			result.setUpdatetime(rs.getString("updatetime"));
//			result.setName(rs.getString("name"));
//			result.setAreaNo(rs.getString("area_no"));
//			result.setItemId(rs.getString("item_id"));
//			result.setState(rs.getString("state"));
//			return result;
//		});
		AREAS.clear();
		List<String> strs = ywProductAreaRepository.loadProductAreas();
//		List<String> strs = list.stream().map(PaProductArea::getAreaNo).collect(Collectors.toList());
//		strs = strs.stream().map(areano -> areano.substring(0, 2)).collect(Collectors.toList());
		AREAS.addAll(strs);
	}
}
